﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

namespace WebApplication1
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // 如果是第一次加载就填充数据
            if (!IsPostBack)
            {
                FillData();
            }
        }
        // 填充数据
        private void FillData()
        {
            // 传入sql语句
            var sql = "select * from Articles";
            // 调用 DbHelp.GetSelect 方法，接收传出的dt数据表
            var dt = DbHelper.GetSelect(sql);
            // 将数据表的值赋值给gv1
            this.gv1.DataSource = dt;
            // 将数据源绑定到gv1上
            gv1.DataBind();
        }
        // 获取单元格里面的值
        private string GetCellValue(int rowIndex, int colIndex)
        {
            // 获取行索引为rowIndex,单元格（列）索引为colIndex的单元格
            var cell = gv1.Rows[rowIndex].Cells[colIndex];
            // 判断这个单元格里面的子控件数量是否大于0
            // 如果大于0就说明有子控件，我们就获取子控件里面的值
            // 如果没有大于0就说明没有子控件，我们就直接获取单元格里面的值
            var str = cell.Controls.Count > 0 ? ((TextBox)cell.Controls[0]).Text : cell.Text;
            return str;
        }
        // 编辑
        protected void gv1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            // 获取或设置正在编辑的行的索引
            gv1.EditIndex = e.NewEditIndex;
            FillData();
        }
        // 删除
        protected void gv1_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            // 获取需要删除的Id
            var id = GetCellValue(e.RowIndex, 0);
            // 传入删除的sql语句
            var sql = string.Format("delete Articles where Id = {0}",id);
            DbHelper.GetIDU(sql);
            FillData();
        }
        // 更新
        protected void gv1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            // 判断Id是否存在
            var idString = GetCellValue(e.RowIndex, 0);
            var isOk = int.TryParse(idString, out int Id); // 返回的是一个bool值（true或者false）
            // 获取Id
            var id = GetCellValue(e.RowIndex, 0);
            // 获取文章标题
            var title = GetCellValue(e.RowIndex, 1);
            // 获取文章内容
            var content = GetCellValue(e.RowIndex, 2);
            // 获取文章作者
            var author = GetCellValue(e.RowIndex, 3);
            // 获取备注
            var remarks = GetCellValue(e.RowIndex, 4);
            if (isOk)
            {
                // 传入更新的sql语句
                var sql = string.Format("update Articles set Title = '{0}', Content = '{1}', Author = '{2}',Remarks = '{3}' where Id = {4}", title, content, author, remarks, id);
                DbHelper.GetIDU(sql);
            }
            else
            {
                // 传入插入的sql语句
                var sql = string.Format("insert into Articles (Title, Content, Author, Remarks) values('{0}', '{1}', '{2}', '{3}')", title, content, author, remarks);
                DbHelper.GetIDU(sql);
            }
            // 更新完退出编辑模式
            gv1.EditIndex = -1;
            FillData();
        }
        // 取消编辑
        protected void gv1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gv1.EditIndex = -1;
            FillData();
        }
        // 添加文章
        protected void btn_Add_Click(object sender, EventArgs e)
        {
            // 以下操作相当于克隆了一份 gv1 的表
            DataTable dt = new DataTable(); // 创建一个空的数据表
            dt.Columns.Add(new DataColumn("Id")); // 往dt表里添加Id新列
            dt.Columns.Add(new DataColumn("Title")); // 往dt表里添加Title新列
            dt.Columns.Add(new DataColumn("Content")); // 往dt表里添加Content新列
            dt.Columns.Add(new DataColumn("Author")); // 往dt表里添加Author新列
            dt.Columns.Add(new DataColumn("Remarks")); // 往dt表里添加Remarks新列
            // 将 gv1 里面的每一行数据都赋值给 row
            foreach (GridViewRow row in gv1.Rows)
            {
                var newRow = dt.NewRow(); // 创建一个与表有相同架构的数据行
                // 调用 GetCellValue 方法，传入每一行 row 行和列的索引
                // 将获取到的值赋值给 newRow[所对应的索引]
                newRow["Id"] = GetCellValue(row.RowIndex, 0).Replace("nbsp;", "");
                newRow["Title"] = GetCellValue(row.RowIndex, 1).Replace("nbsp;", "");
                newRow["Content"] = GetCellValue(row.RowIndex, 2).Replace("nbsp;", "");
                newRow["Author"] = GetCellValue(row.RowIndex, 3).Replace("nbsp;", "");
                newRow["Remarks"] = GetCellValue(row.RowIndex, 4).Replace("nbsp;", "");
                // 将每行 newRow 的值添加到 dt 里面
                dt.Rows.Add(newRow);
                // 以上行为代表完成gv1表的克隆
            }
            dt.Rows.Add(dt.NewRow()); // 创建新行
            //gv1.DataSource = dt;
            //gv1.DataBind();
            // 如：dt表插入一行后数量为4行，4 - 1 = 3，所以将3赋值给gv1表，索引为3
            // 右边为count数量（从1开始），左边为索引号（从0开始）
            gv1.EditIndex = dt.Rows.Count - 1;
            // 绑定数据
            gv1.DataSource = dt;
            gv1.DataBind();
        }
    }
}